// 引入 Node.js 的 fs 模块，用于文件系统操作
const fs = require("fs");
const execa = require("execa");
/**
 * 同步读取指定目录下的所有子项，并过滤出目录项。
 * @returns {Array<string>} 过滤后的目录名数组。
 */
//同步读取文件
const targets = fs.readdirSync("packages").filter((f) => {
  // 检查 packages 目录下的子项是否为目录
  if (!fs.statSync(`packages/${f}`).isDirectory()) {
    // 如果不是目录，则过滤掉该子项
    return false;
  }
  // 如果是目录，则保留该子项
  return true;
});

console.log(targets, "targets");

/**
 * 使用 Rollup 构建指定目标的代码。
 *
 * @param {string} target - 要构建的目标项目名称。
 * @returns {Promise} - 一个 Promise，当构建完成时解析。
 */
async function build(target) {
  // 使用 execa 执行 rollup 命令进行代码构建
  await execa("rollup", ["-c", "--environment", `TARGET:${target}`], {
    // 将子进程的标准输入、输出和错误流与父进程继承
    stdio: "inherit",
  });
}

/**
 * 并行执行一系列操作
 *
 * 本函数旨在并行执行针对多个目标的操作，并收集这些操作的结果
 * 它接受一个目标集合和一个迭代函数作为参数，该迭代函数对每个目标执行异步操作
 *
 * @param {Array} targets - 一个数组，包含需要进行异步操作的目标元素
 * @param {Function} iteratorFn - 一个异步函数，用于对每个目标执行操作，应返回一个Promise
 * @returns {Promise} - 返回一个Promise对象，当所有异步操作成功完成时，这个Promise会解析为一个包含所有操作结果的数组
 */
function runParallel(targets, iteratorFn) {
  // 初始化一个数组，用于存储所有异步操作的Promise对象
  const ret = [];

  // 遍历目标集合，对每个目标执行迭代函数
  for (const item of targets) {
    // 对当前目标执行迭代函数，并获得一个Promise对象
    const p = iteratorFn(item);
    // 将这个Promise对象添加到集合中
    ret.push(p);
  }

  // 使用Promise.all等待所有异步操作完成，并返回包含所有结果的Promise对象
  return Promise.all(ret);
}

runParallel(targets, build);
